////////////////////////////////////////////////
// DESCRIPTION:
//    Threading Model support for single threaded systems.
//
// Legal Notices:
//     Copyright (c) 2008, Telliam Consulting, LLC.
//     All rights reserved.
//
//     Redistribution and use in source and binary forms, with or without modification,
//     are permitted provided that the following conditions are met:
//
//     * Redistributions of source code must retain the above copyright notice,
//       this list of conditions and the following disclaimer.
//
//     * Redistributions in binary form must reproduce the above copyright notice,
//       this list of conditions and the following disclaimer in the documentation
//       and/or other materials provided with the distribution.
//
//     * Neither the name of Telliam Consulting nor the names of its contributors
//       may be used to endorse or promote products derived from this software
//       without specific prior written permission.
//
// Disclaimer:
//     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
//     ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
//     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
//     IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
//     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
//     BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
//     DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
//     LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
//     OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
//     OF THE POSSIBILITY OF SUCH DAMAGE.  
//

#include <FusionWare\win32\synchobjs.h>

using namespace FusionWare::Threads;

void ThreadingModel::CriticalSection::Init(CRITICAL_SECTION* pCS)
{
    InitializeCriticalSection(pCS);
}

void ThreadingModel::CriticalSection::Enter(CRITICAL_SECTION* pCS)
{
    EnterCriticalSection(pCS);
}

void ThreadingModel::CriticalSection::Leave(CRITICAL_SECTION* pCS)
{
    LeaveCriticalSection(pCS);
}

void ThreadingModel::CriticalSection::Delete(CRITICAL_SECTION* pCS)
{
    DeleteCriticalSection(pCS);
}

bool ThreadingModel::CriticalSection::TryEnter(CRITICAL_SECTION* pCS)
{
    return TryEnterCriticalSection(pCS) ? true : false;
}

// Handles all deferred init functionality once threading is enabled
// for a Windows CE OAL this should be called from a IOCTL_HAL_POSTINIT
// handler. FusionWare::OAL::StdOalImpl::PostInit() does that automatically.
void ThreadingModel::DoDeferredInit()
{
}

// Group = Interlockedxxx functions

long ThreadingModel::AtomicIncrement(long* pAddend)
{
    return InterlockedIncrement(pAddend);
}

long ThreadingModel::AtomicDecrement(long* pAddend)
{
    return InterlockedDecrement(pAddend);
}

long ThreadingModel::AtomicExchange(long* pTarget, long Value)
{
    return InterlockedExchange(pTarget, Value);
}

long ThreadingModel::AtomicCompareExchange(IN OUT long* pDestination, long Exchange, long Comparand)
{
    return InterlockedCompareExchange(pDestination, Exchange, Comparand);
}

long ThreadingModel::AtomicExchangeAdd(long* Addend, long Value)
{
    return InterlockedExchangeAdd(Addend, Value);
}

